As software products become larger and more complex, it is increasingly more difficult to create new products based on existing software products and to service these products as demanded by market and competitive needs. An operating system (OS) is an example of a relatively large, complex software product.
The operating system manages and schedules the resources of a computer or device in which it resides, and provides various function modules and interfaces that may be used by applications to accomplish various tasks. A conventional computer generally executes its operating system to manage various aspects of the computer as it is running. For example, the operating system is typically responsible for managing access to storage devices as well as input and/or output devices, and controlling the execution of one or more additional applications. Installation usually occurs before the computer executes the operating system (e.g., by copying multiple files from a distribution medium such as a CDROM onto a hard disk of the computer).
A conventional operating system has a large number of files (e.g., thousands) for instructions and/or data. Such instructions, when executed by the computer, provide the operating system's functionality. In addition to the large number of files, the operating system usually has a large number of dependencies among files. For instance, many files may require the installation of one or more other files for their intended functionality to be carried out. Although the operating system's manufacturer may know of such dependencies at the time of installation, it can be difficult for a user, administrator, or other software developer to learn about these dependencies. This can prove troublesome, as software developers may not know what data or instructions in other files affect the particular file(s) with which they are concerned. Similarly, an administrator or user troubleshooting a malfunctioning computer may not know which files are applicable to the problem without knowledge of the dependencies.
Moreover, a typical operating system is generally monolithic in nature. Those skilled in the art are familiar with conventional operating systems, in which both server and client OS products are built from a giant central file that contains all of the binary files. In this example, a setup executable must specify which files are included in the different products. Thus, relationships between various parts of each product are difficult to understand. This lack of information hinders the ability to service pieces of an operating system during its lifecycle. In other words, it becomes more difficult for developers and others to keep track of all the different modules and files of the operating system to ensure that they will work properly together and individually as the operating system becomes bigger and more complicated.
As an example, a particular OS product may be sold as a “home” version while a premium product with additional features may be sold as a “professional” version. In this instance, the home and professional products will often include branding information and other references interspersed throughout the many binary files making up the respective products. Unfortunately, creation and servicing of products is extremely laborious and requires extensive testing due to relationships between binary files and the existence of these branding references (each of which must be changed for a new product).
The operating system may be modified (e.g., updated or serviced) in any of a wide variety of manners, such as by adding or replacing one or more particular binary files, by any of a wide variety of people (e.g., a user, administrator, software developer other than the operating system developer, etc.). When such modifications occur, it increases the difficulty of identifying dependencies among files existing on the computer. For example, a change to a single file may necessitate a change to other dependent files. Further, it becomes even more difficult to troubleshoot a malfunctioning computer or update the operating system because the user or administrator cannot easily know exactly what functionality is or should be installed on the computer.
Accordingly, software componentization is desired to address one or more of these and other disadvantages and to allow, among other things, building improved operating systems.